package com.shareppy.normanapitest.lexic;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.shareppy.normanapitest.lexic.lexemes.IdentifierLexeme;
import com.shareppy.normanapitest.lexic.lexemes.LexemeState;
import com.shareppy.normanapitest.lexic.lexemes.LiteralLexeme;
import com.shareppy.normanapitest.lexic.lexemes.NumericLiteralLexeme;
import com.shareppy.normanapitest.lexic.lexemes.OperatorLexeme;
import com.shareppy.normanapitest.lexic.lexemes.SingleLiteralLexeme;
import com.shareppy.normanapitest.lexic.lexemes.StartLexeme;

public class LexemeCreator {

	private Map<LexemeType, Lexeme> prototypes;

	public LexemeCreator() {
		prototypes = new HashMap<LexemeType, Lexeme>();
		prototypes.put(LexemeType.LITERAL, new LiteralLexeme());
		prototypes.put(LexemeType.LITERAL, new SingleLiteralLexeme());
		prototypes.put(LexemeType.OPERATOR, new OperatorLexeme());
		prototypes.put(LexemeType.INDENTIFIER, new IdentifierLexeme());
		prototypes.put(LexemeType.NUMERIC_LITERAL, new NumericLiteralLexeme());
	}

	public Lexeme create(char ch) {
		try {
			Set<Entry<LexemeType, Lexeme>> entrySet = prototypes.entrySet();
			for (Entry<LexemeType, Lexeme> entry : entrySet) {
				Lexeme value = entry.getValue();
				if (value.supports(ch) == LexemeState.START) {
					Lexeme clone = (Lexeme) value.clone();
					clone.setContent(ch);
					return clone;
				}
			}
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return new StartLexeme();
	}
}